package com.example.borui.partpositionproject.partpisition.base;

import android.content.Context;
import android.support.v7.widget.RecyclerView;

import com.example.borui.partpositionproject.partpisition.adapter.IPartInterface;
import com.example.borui.partpositionproject.partpisition.adapter.PartPistionAdapterHelper;
import com.example.borui.partpositionproject.partpisition.view.IPartPositionBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by borui on 2017/9/28.
 * 集群分区 这个就是嵌套一层 解决类似 购物车中 满减view 的问题
 */
public abstract class BaseClusterPartPosition<C> extends BasePartPosition  implements IPartInterface<Integer> {

    private PartPistionAdapterHelper partPistionAdapterHelper;

    /*** 这个是集群中的 子分区 的 id 坐标 ***/
    private List<Integer> clusList;

    /*** 这个map 是用来解决 嵌套viewType的问题
     * 在外层已经用了一次 helper 中的算法 所以这边嵌套 就不能再用了
     * 否则会导致viewType 重复的问题，所以我在这里获取viewType 的时候
     * 将viewType 作为key 分区id 作为value 存在这个map 中 这样在onCreateViewHolder 中就可以
     * 再拼装成 helper 中需要的值了
     */
    private Map<Integer, Integer> viewTypeMap;

    public BaseClusterPartPosition(Context mContext, int type, int position, IPartPositionView view) {
        super(mContext, type, position, view);
        partPistionAdapterHelper = new PartPistionAdapterHelper(this);
        clusList = new ArrayList<>();
        viewTypeMap = new HashMap<>();
    }

    @Override
    public RecyclerView.ViewHolder createViewHolder(int viewType) {
        if(viewTypeMap.containsKey(viewType)){
            int partPosition = viewTypeMap.get(viewType);
            return partPistionAdapterHelper.onCreateViewHolder(viewType + partPosition * 10000);
        }
        return partPistionAdapterHelper.onCreateViewHolder(viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        partPistionAdapterHelper.onBindViewHolder(holder, position);
    }

    @Override
    public int getItemViewType(int position) {
        // 把 helper 中的值 拿出来 拆开 并保存 相应的 key 和 value
        int viewType = partPistionAdapterHelper.getItemViewType(position);
        int partPosition = viewType / 10000; // 分区位置
        int type = viewType % 10000;   // view 的type
        viewTypeMap.put(type, partPosition);
        return type;
    }

    @Override
    public int getSpanCount(int position) {
        return partPistionAdapterHelper.getSpanCount(position);
    }

    @Override
    protected void createList() {
        mList.clear();
        viewTypeMap.clear();
        clusList.clear();
        if(null != getData() && getData() instanceof IPartPositionBean){
            IPartPositionBean iPartPositionBean = (IPartPositionBean) getData();
            addPositionItems(iPartPositionBean.getChildBeans());
            BasePartPosition basePartPosition = partPistionAdapterHelper.getLastProcessor();
        }
    }

    @Override
    public Integer getItem(int position) {
        return (Integer) clusList.get(position);
    }

    @Override
    public void clear() {
        mList.clear();
        viewTypeMap.clear();
        clusList.clear();
        notifyDataSetChanged();
    }

    @Override
    public void notifyDataSetChanged() {

    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    @Override
    public void addItems(List<Integer> mList) {
        for(Integer integer:mList){
            this.mList.add(getAreaPosition());
        }
        clusList.addAll(mList);
    }

    public void updatePositionItems(List<IPartPositionBean> mDatas) {
        partPistionAdapterHelper.updatePositionItems(mDatas);
    }

    public void addPositionItem(IPartPositionBean mData) {
        partPistionAdapterHelper.addPositionItem(mData);
    }

    public void addPositionItems(List<IPartPositionBean> mDatas) {
        partPistionAdapterHelper.addPositionItems(mDatas);
    }

    public void notifyProcessAdapter() {
        partPistionAdapterHelper.notifyProcessAdapter();
    }

    public PartPistionAdapterHelper getPartPistionAdapterHelper() {
        return partPistionAdapterHelper;
    }

    @Override
    public abstract BasePartPosition buildProcessor(int position, IPartPositionBean bean);

    @Override
    public void onDestory() {
        clear();
    }
}
